package com.sjgl.esdn.service;

import com.sjgl.esdn.domain.entity.TempBlog;
import com.sjgl.esdn.domain.entity.File;
import com.sjgl.esdn.domain.entity.vo.HotFileVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;

/**
 * 文件 服务层
 *
 * @author Administrator
 * @date 2022/08/05
 */

@Service
public interface FileService {

    /**
     * 插入文件（文档信息，可查看部门，标签设置）
     *
     * @param file     文件
     * @param deptIds  部门id
     * @param labelIds 标签id
     * @return int
     */
    public int insertFile(File file, List<Long> deptIds,List<Long> labelIds);

    /**
     * 插入文件（文档信息，可查看部门，标签设置）
     *
     * @param file    文件
     * @param deptIds 部门id
     * @return int
     */
    public int insertFile(File file, List<Long> deptIds);

    /**
     * 插入文件es
     *
     * @param file 文件
     */
    public void insertFileES(File file) throws IOException;

    /**
     * 得到文件名与后缀的分割点
     *
     * @param fileName 文件名称
     * @return 未找到时返回-1
     */
    public int getSplitPoint(String fileName);

    /**
     * 得到存储文件夹
     *
     * @param fileSuffix 文件后缀
     * @return {@link String} 未找到时返回：null
     */
    public String selectFolder(String fileSuffix);

    /**
     * 选择文件路径通过id
     *
     * @param fileId 文件标识
     * @return {@link String}
     */
    public String selectFilePathById(Long fileId);

    /**
     * 选择pdf路径通过id
     *
     * @param fileId 文件标识
     * @return {@link String}
     */
    public String selectPdfPathById(Long fileId);

    /**
     * 删除文件（伪删除）
     *
     * @param fileId 文件id
     * @param userId 用户id
     * @param reason 原因
     * @return int -1传入参数出错，0无权限，>=1成功
     */
    public int deleteFile(Long fileId, Long userId, String reason);

    /**
     * 删除文件es
     *
     * @param fileId 文件id
     */
    public void deleteFileES(Long fileId);

    /**
     * 下载文件
     *
     * @param fileId 文件id
     * @param userId 用户id
     * @return int
     */
    public int downloadFile(Long fileId, Long userId);

    /**
     * 下载文件es
     *
     * @param fileId 文件id
     */
    public void downloadFileES(Long fileId) throws IOException;

    /**
     * 修改文件
     *
     * @param file    文件
     * @param deptIds 部门id
     * @return int
     */
    public int updateFile(File file, List<Long> deptIds);

    /**
     * 判断用户是否有修改文件的权限
     *
     * @param userId 用户id
     * @param fileId 文件标识
     * @return boolean
     */
    public boolean canUserUpdateFile(Long userId, Long fileId);

    /**
     * 判断用户是否有查看文件的权限
     *
     * @param userId 用户id
     * @param fileId 文件标识
     * @return boolean
     */
    public boolean canUserLookFile(Long userId, Long fileId);

    /**
     * 判断用户是否下载过文件
     *
     * @param userId 用户id
     * @param fileId 文件标识
     * @return boolean
     */
    public boolean hasUserDownloadFile(Long userId, Long fileId);

    /**
     * 判断用户是否浏览过文件
     *
     * @param userId 用户id
     * @param fileId 文件标识
     * @return boolean
     */
    public boolean hasUserBrowseFile(Long userId, Long fileId);

    /**
     * 判断文件能否转pdf
     *
     * @param suffix 后缀
     * @return boolean
     */
    public boolean canFileToPdf(String suffix);

    /**
     * 查询文件通过id
     *
     * @param fileId 文件标识
     * @return {@link File}
     * @throws IOException ioexception
     */
    public File selectFileById(Long fileId);

    /**
     * 浏览文件(有记录浏览量及关系表)
     *
     * @param fileId 文件id
     * @param userId 用户id
     * @return {@link File}
     * @throws IOException ioexception
     */
    public File lookFile(Long fileId, Long userId) throws IOException;

    /**
     * 查询文件列表通过id列表
     *
     * @param fileIdList 文件id列表
     * @return {@link List}<{@link File}>
     * @throws IOException ioexception
     */
    public List<File> selectFileListByIdList(List<Long> fileIdList) throws IOException;

    /**
     * 获得上传文件列表通过用户id
     *
     * @param userId 用户id
     * @return {@link List}<{@link File}>
     */
    public List<File> getUploadFileListByUserId(Long userId) throws IOException;

    /**
     * 获得预览图（不存在时暂定返回null）
     *
     * @param fileId 文件id
     * @return {@link BufferedImage}
     */
    public BufferedImage getPreview(Long fileId) throws IOException;

    /**
     * 获得预览url
     *
     * @param fileId 文件id
     * @return {@link String}
     * @throws IOException ioexception
     */
    public String selectPreviewPath(Long fileId);

    /**
     * 获得文档内容
     *
     * @param file
     * @return {@link String}
     */
    public String getStringFromFile(com.sjgl.esdn.domain.entity.File file) throws Exception;

    /**
     * 是否文件存在
     *
     * @param fileId 文件id
     * @return {@link Boolean}
     */
    public Boolean isFileExist(Long fileId);

    /**
     * 是否用户喜欢文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return {@link Boolean}
     */
    public Boolean isUserLikeFile(Long userId, Long fileId);

    /**
     * 是否用户收藏文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return {@link Boolean}
     */
    public Boolean isUserCollectionFile(Long userId, Long fileId);

    /**
     * 删除用户喜欢文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     * @return int
     */
    public int deleteUserLikeFile(Long userId, Long fileId);

    /**
     * 添加用户喜欢文件
     *
     * @param userId 用户id
     * @param fileId 文件id
     */
    public int addUserLikeFile(Long userId, Long fileId);

    /**
     * 保存临时博客
     *
     * @param tempBlog 临时博客
     * @return int
     */
    public int saveTempBlog(TempBlog tempBlog);

    /**
     * 获得临时博客列表
     *
     * @param userId 用户id
     * @return {@code List<File>}
     */
    public List<TempBlog> getTempBlogList(Long userId);

    /**
     * 获得热点文件列表
     *
     * @param userId 用户id
     * @param limit  限制
     * @return {@code List<HotFileVo>}
     */
    public List<HotFileVo> getHotFileList(Long userId,Long limit);

    /**
     * 得到最近下载文件列表
     *
     * @param days   天
     * @param limit  限制
     * @param userId 用户id
     * @return {@code List<File>}
     */
    public List<File> getRecentDownloadFileList(Long userId,Long days,Long limit);
}
